package com.z.redis.command;

import java.util.function.Supplier;
import com.z.redis.command.impl.*;
import com.z.redis.command.impl.list.*;
import com.z.redis.command.impl.string.*;
import com.z.redis.command.impl.set.*;
import com.z.redis.command.impl.hash.*;
import com.z.redis.command.impl.zset.*;

public enum CommandType {
    auth(Auth::new),client(Client::new),config(Config::new), // 客户端认证、管理客户端连接、动态修改服务配置
    decr(Decr::new),incr(Incr::new),del(Del::new),exists(Exists::new), // 原子增减数值、删除和检查键值是否存在
    expire(Expire::new),ttl(Ttl::new), keys(Keys::new),select(Select::new), // 管理键的过期时间、键匹配查询或切换数据库
    ping(Ping::new),quit(Quit::new),info(Info::new),type(Type::new), // 检测连接是否存活、关闭连接、获取服务端运行状态信息、查询键的数据类型
    scan(Scan::new), // 获取所有的键值对
    // string
    set(Set::new),get(Get::new),setex(SetEx::new),setnx(SetNx::new),mset(Mset::new),
    // list
    lrange(Lrange::new),llen(Llen::new),rpop(Rpop::new),lpush(Lpush::new),rpush(Rpush::new), // 列表的头部或者尾部插入数据
    // set
    sadd(Sadd::new),sscan(Sscan::new),srem(Srem::new),smembers(Smembers::new),scard(Scard::new),
    // hash
    hset(Hset::new),hget(Hget::new),hdel(Hdel::new),hlen(Hlen::new),
    // zset
    zadd(Zadd::new),zrange(Zrange::new),zrem(Zrem::new),zcard(Zcard::new),zrevrange(Zrevrange::new),
    ;

    private final Supplier<Command> supplier;

    CommandType(Supplier supplier)
    {
        this.supplier = supplier;
    }

    public Supplier<Command> getSupplier()
    {
        return supplier;
    }
}
